<?php

class PostTag extends CActiveRecord {
    /**
     * The followings are the available columns in table 'z_post_tag':
     * @var integer $id_cat_post
     * @var integer $frequency
     */

    /**
     * Returns the static model of the specified AR class.
     * @return PostTag the static model class
     */
    public static function model($className=__CLASS__) {
        return parent::model($className);
    }

    /**
     * @return string the associated database table name
     */
    public function tableName() {
        return 'z_post_tag';
    }

    /**
     * @return array validation rules for model attributes.
     */
    public function rules() {
        // NOTE: you should only define rules for those attributes that
        // will receive user inputs.
        return array(
                array('frequency', 'required'),
                array('frequency', 'numerical', 'integerOnly'=>true),
                // The following rule is used by search().
                // Please remove those attributes that should not be searched.
                array('id_cat_post, frequency', 'safe', 'on'=>'search'),
        );
    }

    /**
     * @return array relational rules.
     */
    public function relations() {
        // NOTE: you may need to adjust the relation name and the related
        // class name for the relations automatically generated below.
        return array(
        );
    }

    /**
     * @return array customized attribute labels (name=>label)
     */
    public function attributeLabels() {
        return array(
                'id_cat_post' => 'Id Cat Post',
                'frequency' => 'Frequency',
        );
    }

    public function findTagWeights($limit=20) {
        $models=$this->findAll(array(
                'order'=>'frequency DESC',
                'limit'=>$limit,
        ));

        $total=0;
        foreach($models as $model)
            $total+=$model->frequency;

        $tags=array();
        if($total>0) {
            foreach($models as $model)
                //$tags[$model->name]=10+(int)(log($model->frequency + 1));
                $tags[$model->name] = ceil ( log ( $model->frequency + 1 ) * 12 );
            ksort($tags);
        }
        return $tags;
    }

    /**
     * Suggests a list of existing tags matching the specified keyword.
     * @param string the keyword to be matched
     * @param integer maximum number of tags to be returned
     * @return array list of matching tag names
     */
    public function suggestTags($keyword,$limit=20) {
        $tags=$this->findAll(array(
                'condition'=>'name LIKE :keyword',
                'order'=>'frequency DESC, Name',
                'limit'=>$limit,
                'params'=>array(
                        ':keyword'=>"%$keyword%",
                ),
        ));
        $names=array();
        foreach($tags as $tag)
            $names[]=$tag->name;
        return $names;
    }

    public static function string2array($tags) {
        return preg_split('/\s*,\s*/',trim($tags),-1,PREG_SPLIT_NO_EMPTY);
    }

    public static function array2string($tags) {
        return implode(', ',$tags);
    }

    public function updateFrequency($oldTags, $newTags) {
        $oldTags=self::string2array($oldTags);
        $newTags=self::string2array($newTags);
        $this->addTags(array_values(array_diff($newTags,$oldTags)));
        $this->removeTags(array_values(array_diff($oldTags,$newTags)));
    }

    public function addTags($tags) {
        $criteria=new CDbCriteria;
        $criteria->addInCondition('name',$tags);
        $this->updateCounters(array('frequency'=>1),$criteria);
        foreach($tags as $name) {
            if(!$this->exists('name=:name',array(':name'=>$name))) {
                $tag=new PostTag;
                $tag->name=$name;
                $tag->frequency=1;
                $tag->save();
            }
        }
    }

    public function removeTags($tags) {
        if(empty($tags))
            return;
        $criteria=new CDbCriteria;
        $criteria->addInCondition('name',$tags);
        $this->updateCounters(array('frequency'=>-1),$criteria);
        $this->deleteAll('frequency<=0');
    }
}